========================================================================
Итак нам понадобится :
1. IDA Pro 4.8 (ищем в инете) + WinHEX
2. Документация по архитектуре ARM (12 метров дока !!!)
http://dsl.ee.unsw.edu.au/dsl-cdrom/ref ... erence.pdf3. Документация на процессор OMAP 5910 (качаем с сайта ti.com, эта документация в большинстве своем справедлива для нашего OMAP310)
4. WSSFXBI.exe - прога от Папуаса для выковыривания из свупа бинарников прошивки. (Внизу поста ссылка)
5. Программа от FCA00000 - FCAMem с установленным патчем к ней. ( см раздел Патчи )
6. Список функций прошивки от FCA00000 - наверное самое важное в копании прошивки.
O2_14_symbol.rar 7. Также пригодится SDK Симбы с плугином от сименса - SMTK.
8. Эмулятор ARM - simarm. Для детального анализа программ и прошивки.
9. Желательно знание и понимание языка С++, обьектов и тп.
10. Прямые руки (hands.dll) - обязательно.
11. Желание и свободное время - необходимо как воздух.
Мои скрипты и некоторые проги:
idc_files.zipЧтобы не качать SDK для работы скрипта rename.idc можно взять необходимые файлы здесь:
objdump.rarcygwin1.zipsx1_sdk_libs.exeВсе нижесказанное относится к прошивке WinSWUP fw 15 UK-DE-RU
========================================================================
0 - Прежде всего:
- читаем документацию по архитектуре процессора ARM, чтоб понятно было какие регистры есть, какие команды, какие условия переходов и тд.
- ставим патч для FCAMem
- желательно посмотреть на схему SX1, его омаповской части, чтоб представлять что к чему подключено.
========================================================================
1-Делаем полный образ диска Z.
Для этого есть два пути.
---------------------------------------------------------------------------
Первый (если есть ММС) - воспользуемся прогой от FCA00000 - FCAMem. С ее помощью считываем области памяти, каждую в отдельный файл. После сохранения каждого файла переименовываем mem.bin в чтото типа mem50000000.bin.
0x50000000 длина 16Mb (0x01000000) - сам диск Z
0x58000000 длина 6кб - регистры
0x58002000 длина 26кб - регистры
0x58009000 длина 2кб - регистры
0x5800A000 длина 2кб - регистры
0x5800B000 длина 2кб - регистры
0x5800C000 длина 16кб - регистры
0x40000000 длина 8кб - память ядра
0x41000000 длина 8кб - память ядра
0x80000000 длина 32кб - память ядра
0x80400000 длина 64кб - память ядра
---------------------------------------------------------------------------
Второй путь - использовние программы WSFFXBI.exe от PapuaSoft.
Открываем в меню File -> Open -> WinSWUP + XB?.exe файл SWUP прошивки.
Далее File -> Save -> XBI file (xbi).
Мы получили файл, содержащий в себе все части прошивки OMAP.
Далее распаковуем на части с помощью
XBI_Extract (Serrge, Oslik.ru), получим следующие файлы:
- 07102004-K1_core.img - диск Z1
- 07102004-K1_SiemensvA114_z2.plf - диск Z2
- 07102004-K1_SiemensvA114_rolf.plf - образ ROLF (диск A)
- ibootcore_1_8.plf - iBoot
- K1_cdriv_cd_new_fsy.plf - LFFS (чистый диск С)
- SX1_15.xbz - сжатая прошивка EGold (телефонного процессора), c хешами и сигнатурами, распаковке пока не поддается.
Эти файлы имеют заголовки, в которых указаны адреса с которых они загружаются.
Для img файла заголовок занимает 0x100 байт, для plf - 0x0C0 байт. Поэтому при загрузке в иду заголовки удаляем.
---------------------------------------------------------------------------
Рекомендую скомбинировать оба пути чтоб иметь в иде и диск Z и содержимое оперативы.
Осторожно - после загрузки всего диска в Иду база будет занимать больше 100метров ! Не забывайте делать бекапы !
Рассмотрим карту памяти SX1 - физические (реальные) адреса.
//flash1 - CS0
0x0000 0000 - Z1 drive (Core-Img)
0x00F0 0000 - Z2 drive (Var)
0x00FF FFFF - Z2 drive end (Var)
//flash2 - CS1 - old phones
0x0400 0000 - iBoot (iBoot)
0x040A 0000 - drive A (ROLF)
0x0442 0000 - drive C (Lffs)
0x047F FFFF - drive C end
карта памяти SX1 - виртуальные адреса (в симбе).
//flash1
0x5000 0000 - Z1 drive (Core-Img)
0x50F0 0000 - Z2 drive (Var)
0x5800 0000 - регистры омапа мапятся сюда
Немного об ибуте. Назначение ибута - выполнить прошивку телефона с компьютера по USB интерфейсу. Plf образ который в прошивке нарезан на сегменты. К счастью в этом образе осталась отладочная информация - имена функций и переменных, по которым можно разбиратся с ибутом. Запускается он при нажатии дж.центр + красная кнопка, также если TP3008 = 1 или TP3007 = 1.
========================================================================
2 - загружаем файлы в IDA.
Полученные на предыдущем этапе файлы загружаем в иду по их адресам.
Первым в Иде открываем самый большой файл - от диска Z, ставим "Processor Type" в ARM, нажимаем Set, затем OK, далее Ида предлагает создать сегменты, ставим ROM start adress в 0x50000000, ROM size = 0x01000000, Loading adress = 0x50000000. Жмем ОК и ждем пока файл загрузится.
Дальше File->Load file->Additional binary file загружаем дополнительные части
(Z2, содержимое оперативы и тд.). Дальше рекомендую применить мои скрипты - поставить на ночь rename.idc - после этого примерно 50 процентов кода прошивки будет распознано и можно будет начинать чтолибо копать.
========================================================================
3 - Немного моих скриптов. (Внизу поста ссылка).
- rename.idc - скрипт размечает все файлы диска Z, для исполняемых размечаются таблицы экспортируемых функций, причем их названия берутся из СДК (не для всех конечно, а для тех, для которых они есть). Работает очень долго, поэтому лучше ставить на ночь

Возможно придется подправить путь к lib файлам в скрипте !
- standart_regs.idc - скрипт обзывает все регистры OMAP.(см доки об OMAP5910)
- virtual_regs.idc - скрипт обзывает все регистры OMAP в виртуальном адресном пространстве.
- swi.idc - помечает адреса процедур обработчиков софтварного прерывания SWI.
Не стесняйтесь и заглядывайте в скрипты, в некоторых надо менять пути к файлам данных.
В связи с релизом файла со списком адресов всех функций для прошивки O2_14 от FCA00000, нужно использовать прежде всего его. Он подходит для нашей прошивки практически полностью. Только надо сравнивать начало файла в списке с началом в нашей прошивке - и если они не совпадают учитывать разницу.
========================================================================
4 - Структура диска Z
5000 0000 - "Буткор симбы" эта область при включении телефона находится с адреса 0, он и получает управление при включении, здесь настраивается все оборудование, частота процессора, тайминги памяти, проверяются нажатые клавиши, нужно ли запускать ибут, так же настраивается виртуальная память, и наконец запускается Симба, предположительно ekern.exe. При нажатии на клавиши форматирования диска С происходит стирание первого сектора флеша диска С (128 К), что является признаком необходимости форматирования.
5000 0080 - здесь лежит структура TRomHeader, ее описание находится в СДК, в e32rom.h, там же лежит описание заголовка исполняемых файлов с диска Z (TRomImageHeader).
5000 4000 - ekern.exe vectors. Сдесь находятся векторы прерывания для виртуального режима, также они находятся по виртуальному адресу 0.
5000 4040 - ekern.exe ....
50F0 0000 - variant image
50F2 4538 - каталог диска Z
Основные системные файлы, драйверы устройств, скомпилированы в режиме ARM, поскольку привелигерованные режимы работают только в нем. А остальные проги могут быть и в режиме Thumb.
Через команды SWI осуществляется вызов функций ядра из euser.dll, то есть связь юзермода с кернелмодом. Если в патче необходимо сделать чтолибо в режиме ядра то можно использовать SWI. Так сделан патч на переключение частоты процессора из симбы. Программа вызывает функцию User:SetDebugMask, которая как мне кажется не используется ни в одной программе, далее обработчик этой функции патчится чтоб вызывать SWI 0xEB, которое не используется в системе. А уже в обработчике этого прерывания можно делать все что угодно со всеми регистрами и всей памятью.
Еще одна проблема - как найти свободное место для размещения своего кода для патчей. Для маленьких вставок я использовал неиспользуемые места в прошиве. Но лучше для своих патчей взять какой либо файл, который не используется или не очень нужен, как например какая либо из стандартных мелодий.
========================================================================
5 - Пример работы для написания простого патча.
Пример моих действий при написании патча номер 61 -
; * Отменить очистку списков вызовов при смене SIM*
; * Disable_clear_logs_after_SIM_change*
В данном случае все просто, просматривая список функций в Sysap.app, я обратил внимание на интересное название, которое говорит само за себя.
50854844 ; CSysApAppUi::DoSimChangedFromPreviousBootL(void)
50854844 sub_50854844 ; CODE XREF: sub_50852460+332p
50854844 10 B5 PUSH {R4,LR}
50854846 03 F0 BL j_NewL__11CSimChanged ; CSimChanged::NewL(void)
5085484A 04 1C ADD R4, R0, #0
5085484C 03 F0 BL j_CleanShared__11CSimChanged ; CSimChanged::CleanShared(void)
50854850 00 2C CMP R4, #0
50854852 05 D0 BEQ loc_50854860
50854854 20 68 LDR R0, [R4]
50854856 82 68 LDR R2, [R0,#8]
50854858 20 1C ADD R0, R4, #0
5085485A 03 21 MOV R1, #3
5085485C 02 F0 BL sub_508571F8
50854860 loc_50854860 ; CODE XREF: sub_50854844+Ej
50854860 10 BC POP {R4}
50854862 01 BC POP {R0}
50854864 00 47 BX R0
Далее делаем пробный патч для отключения данной функции, для этого нам надо произвести немедленный возврат из нее.
Заменяем инструкцию по адресу :
50854846 BL j_NewL__11CSimChanged ; CSimChanged::NewL(void)
заменяем на возврат из процедуры, код берем здесь же, в конце процедуры :
50854860 10 BC POP {R4}
50854862 01 BC POP {R0}
50854864 00 47 BX R0
чтоб получить строку патча, нужны исходные данные - что заменять. Их берем из окна HEX view в Иде, для надежности нужно брать не менее 16 байт.
Получаем
- replace:03F01BFF041C03F01EFF002C05D0:10BC01BC0047
Далее прошиваем телефон с этим патчем и удостовериваемся что он работает.